package com.ruoyi.equip.vert.service.impl;

import com.ruoyi.common.utils.net.HexUtil;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.equip.domain.TagInfo;
import com.ruoyi.equip.domain.cache.DeviceTagCache;
import com.ruoyi.equip.service.IDeviceInfoService;
import com.ruoyi.equip.util.CacheUtils;
import com.ruoyi.equip.vert.config.TcpServerVerticle;
import com.ruoyi.equip.vert.domain.TcpAnsEntity;
import com.ruoyi.equip.vert.domain.TcpParserEntity;
import com.ruoyi.equip.vert.service.TransferStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

import static com.ruoyi.common.utils.net.HexUtil.listToStrBySymbol;
import static com.ruoyi.equip.util.HeartCacheUtils.setOnline;
import static com.ruoyi.equip.vert.TcpReaderConstant.*;

@Slf4j
@Service
public class ReqTagNumTransfer implements TransferStrategy
{
    IDeviceInfoService deviceInfoService = SpringUtils.getBean(IDeviceInfoService.class);
    TcpServerVerticle tcpServerVerticle = SpringUtils.getBean(TcpServerVerticle.class);

    @Override
    public void transfer(TcpParserEntity tcpParserEntity)
    {
        String readerId = tcpParserEntity.getReaderId();
        List<TagInfo> tagInfos = deviceInfoService.selectTags(readerId);

        List<String> tagLens = tcpParserEntity.getParam();
        int tagLen = HexUtil.hexStrToInt(tagLens.get(0));
        if (tagLen == tagInfos.size()) {
            log.info("标签结束");
            return;
        }
        if (tagLen > tagInfos.size()) {
            log.info("标签数大于当前标签,发送清理");
            TcpAnsEntity tcpAnsEntity = new TcpAnsEntity();
            tcpAnsEntity.setReaderId(readerId);
            tcpAnsEntity.setOptType("3100");
            tcpAnsEntity.setParam("00");
            tcpAnsEntity.setCrc("81");
            tcpServerVerticle.sendMsg(tcpParserEntity.getHandlerID(), tcpAnsEntity.toString());
            return;
        }
        tagInfos.forEach(t ->
        {
            sendOptTagMsg(tcpParserEntity.getHandlerID(),readerId,t.getSbId(),t.getAnt(),t.getType(),TAG_OPT_ADD);
        });

        TcpAnsEntity tcpAnsEntity = new TcpAnsEntity();
        tcpAnsEntity.setReaderId(readerId);
        tcpAnsEntity.setParam("");
        tcpAnsEntity.setOptType("2000");
        tcpAnsEntity.setParamLen("00");
        tcpAnsEntity.setCrc("0a");

        // 设置心跳
        //设置在线缓存
        DeviceTagCache deviceTagCache = CacheUtils.getDeviceTagCache(readerId);
        String deviceId = deviceTagCache.getDeviceId();
        String productKey = deviceTagCache.getProductKey();
        setOnline(deviceId, productKey);
        //tcpServerVerticle.sendMsg(tcpParserEntity.getHandlerID(), tcpAnsEntity.toString());


    }

    public String getType(int type)
    {
        switch (type) {
            case 0: // 温度
                return "03007f01";
            case 1: // 压力
                return "f0000000";
            case 2:  // 温湿度
                return "89000000";
        }
        return "";
    }


    public void sendOptTagMsg(String handlerId, String readerId, String tagSbId, int ant, int type, String tagOpt)
    {
        // 组装返回数据
        TcpAnsEntity tcpAns = new TcpAnsEntity();

        tcpAns.setReaderId(readerId);
        tcpAns.setOptType(ANS_TAG_INFO);
        // 标签信息组装
        List<String> param = new ArrayList<>();
        // 操作类型
        param.add(tagOpt);
        // 天线
        param.add(HexUtil.intToHexStr1(ant));
        // 标签访问密码
        param.add("00000000");
        //操作命令
        param.add(type == 0 ? "5E" : "6F");
        //配置参数 (数据类型)
        param.add(getType(type));

        // 标签长度
        param.add(HexUtil.intToHexStr1(tagSbId.length() / 2));
        param.add(tagSbId);
        //tcpAns.setParamLen(HexUtil.intToHexStr1(param.size()));
        tcpAns.setParam(listToStrBySymbol(param, ""));
        tcpAns.setCrc("0a");
        tcpServerVerticle.sendMsg(handlerId, tcpAns.toString());
    }

}
